<?php
namespace app\api\controller\mytool;

use app\api\controller\Base;
use app\api\controller\Pub;
use app\common\model\power\Rolepower;
use app\common\model\user\User as UserModel;
use app\common\model\customer\Customervisit;
use app\common\model\customer\Customer;

use think\facade\Cache;

//微信消息处理逻辑
class Wechathelper extends Base
{
    private $user; //用户信息
    private $text; //文本信息
    /**
     * 产生jwt加密串，参考session
     */
    public function initialize()
    {
        parent::initialize();
    }

    /**
     * [myinit description]
     * 文本 Content
     * 语音转文本 Recognition
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public function myinit($data = [])
    {   
        // $this->user = UserModel::find();
        // $data['Content'] = '帮我找下合肥的企业';
        $sb= UserModel::iswechatid($data['FromUserName'],true);
        if(!$sb['code']){
            return $sb['msg'];
        }
        $this->user = $sb['msg'];
        
        //归纳为文本
        if (!empty($data['Content'])) {
            $this->text = $data['Content'];
        }
        if (!empty($data['Recognition'])) {
            $this->text = $data['Recognition'];
        }
        //预处理
        if($this->text == '结束服务'||$this->text == '886'){
                Cache::rm('Customer_visit_id_'.$this->user->UserId);
                Cache::rm('Customer_info_'.$this->user->UserId);
                Cache::rm('Search_Customer_'.$this->user->UserId);
                Cache::rm('Wechathelper' . $this->user->UserId);
                return '结束成功';
        }

        //判断沟通状态是否存在
        $sb = self::has_state();
        if (!empty($sb)) {
            //存在沟通状态的系统
            return self::has_state_init($sb);
        } else {
            //进入检测系统
            return self::init_test();
        }
    }

    /**
     * 存在沟通状态的记录
     * @return [type] [description]
     */
    public function has_state_init($statetype)
    {
        switch ($statetype) {
            case '登记信息-查找客户':
                return self::visit_customer($this->text);
                break;
            case '登记信息-找到多个客户':
                return self::select_customer();
                break;
            case '登记信息-信息登记中':
                return self::write_customer_visit();
                break;
            default:
                return '缺失状态';
                break;
        }
    }
    

    /**
     * 判断是否存在沟通状态
     * @return boolean [description]
     */
    public function has_state()
    {
        $sb = Cache::get('Wechathelper' . $this->user->UserId);
        if (empty($sb)) {
            return false;
        } else {
            return $sb;
        }
    }
    /**
     * 判断是否存在沟通状态
     * @return boolean [description]
     */
    public function set_state($state)
    {
        Cache::set('Wechathelper' . $this->user->UserId, $state, 300);
    }


    /**
     * 公众号文本预处理
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public function init_test()
    {
        $keylist = $this->keylist();
        $sb      = ''; //测试变量
        foreach ($keylist as $key => $value) {
            foreach ($value as $kk => $kv) {
                if (mb_strpos($this->text, $kv) !== false) {
                    $sb = $key;
                    break;
                }
            }
            if ($sb !== '') {
                break;
            }
        }
        if($sb =='customervisit' && Rolepower::ispower(201003, $this->user->UserId)){
            //客户搜索跟进功能
            return self::customervisit();
        }else if($sb =='exit'){
            return self::myexit();
        }else{
            //客户管理权限
            if(Rolepower::ispower(201003, $this->user->UserId)){
                if($sb =='search'){
                    return self::search_init();
                }
                return self::search_customer($this->text,true);
                // return '请输入您需要的功能，目前系统支持:'.self::nn().'1、客户搜索(直接输入客户名称即可搜索)'.self::nn().'2、客户回访信息登记（输入：记录与XXXX（客户名称）的回访记录，即可开始）';
            }
            //没有权限
            return '如有什么事情请直接联系我们，联系电话：'.CELLPHONE;
        }
    }

    /**
     * 指令列表
     * @return [type] [description]
     */
    public function keylist($res = '')
    {
        $data = [
            'customervisit' => ['沟通', '跟进', '回访'], //开始跟进回访记录
            'exit'          => ['退出', '结束', '退下', '完成', '清除'], //退出页面
            'help'          => ['帮助','教程','文档'],
            'search'        => ['搜一下','搜下','搜','找一下','找下','找','查一下','查下','查询','查找'],//搜索前置词
            'and'           => ['与','与', '和'], //连接词 登记连接词
            'end'           => ['的', '得', '地','。','企业'],//结束词
        ];
        if (empty($res)) {
            return $data;
        }
        return $data[$res];
    }

    /**
     * 获取某个关键词数组是否存在里面
     * @param  [type]  $type    [description]
     * @param  boolean $isright [统计右边位置，还是左边位置]
     * @return [type]           [description]
     */
    public function get_key_str_wz($type, $isright = true)
    {
        $typelist = self::keylist($type);
        foreach ($typelist as $key => $value) {
            $wz = mb_strpos($this->text, $value);
            if ($wz !== false) {
                if ($isright) {
                    return ($wz + mb_strlen($value));
                } else {
                    return $wz;
                }
            }
            
        }
        return false;
    }
    /**
     * 帮我找下XXX。
     * @return [type] [description]
     */
    public function search_init(){
        $start = self::get_key_str_wz('search');
        $end   = self::get_key_str_wz('end', false);
        if ($start == false || $end == false || $start >= $end) {
            return '请输入您需要查找的客户名称。';
        }
        $customername = mb_substr($this->text, $start, $end-$start);
        return self::search_customer($customername,true);
    }
    /**
     * 客户登记回访信息入口
     * @param  [type] $data [description]
     * @return [type]       [description]
     */
    public function customervisit()
    {
        $start = self::get_key_str_wz('and');
        $end   = self::get_key_str_wz('end', false);
        if ($start == false || $end == false || $start >= $end) {
            self::set_state('登记信息-查找客户');
            return '请输入您需要登记跟进记录的客户名称。';
        }
        $customername = mb_substr($this->text, $start, $end-$start);
        return self::search_customer($customername);
    }
    /**
     * 登记客户信息
     * @return [type] [description]
     */
    public function write_customer_visit(){
        $id = Cache::get('Customer_visit_id_'.$this->user->UserId);
        $data = Cache::get('Customer_info_'.$this->user->UserId);
        if(empty($data)){
            return '没找到您需要的客户信息';
        } 

        if(empty($id)){
            $customer = Customer::get($data['CustomerId']);
            if(empty($customer)){
                return '缺少客户信息请重新搜索客户信息,或者进入页面直接搜索【'.encodeURI(WEBURL.'customer/list').'】';
            }
            //还没有创建
            $ndata = new Customervisit;
            $ndata['BussinessId'] = $this->user->UserId;
            $ndata['CustomerId'] = $data['CustomerId'];
            $ndata['VisitTime'] = date('Y-m-d H:i:s',time());
            $ndata['AddTime'] = date('Y-m-d H:i:s',time());
            $ndata['Content'] = '【本条信息来源于微信助理】'.''.self::nn().''.$this->text;
            $ndata->save();
            //修改统计
            if($customer->LastTime < $ndata['VisitTime']){
                $customer->LastTime = $ndata['VisitTime'];
            }
            $customer->VisitCount = $customer->VisitCount+1;
            $customer->save();
            Cache::set('Customer_visit_id_'.$this->user->UserId,$ndata->CustomerVisitId,600);
        }else{
            if($this->text == '输入完毕'){
                Cache::rm('Customer_visit_id_'.$this->user->UserId);
                Cache::rm('Customer_info_'.$this->user->UserId);
                Cache::rm('Search_Customer_'.$this->user->UserId);
                Cache::rm('Wechathelper' . $this->user->UserId);
                return '信息记录完成';
            }
            $customer = CustomerVisit::get($id);
            if(empty($customer)){
                return '缺少客户信息请重新搜索客户信息,或者进入页面直接搜索【'.encodeURI(WEBURL.'customer/list').'】';
            }
            $customer['Content'] = $customer['Content'].''.self::nn().''.$this->text;
            $customer->save();
        }
        return '已记录，如果需要继续添加，请继续输入。'.self::nn().'温馨提示：输入结束后，可发送【输入完毕】主动结束登记，或者等待15分钟系统自动结束。';
    }
    /**
     * 选择客户列表
     * @return [type] [description]
     */
    public function select_customer(){
        $data = Cache::get('Search_Customer_'.$this->user->UserId);
        if(is_numeric($this->text)){
            $key = ((int)$this->text)-1;
            if(empty($data[$key])){
                return '没有找到您写的序号【'.($key+1).'】，请重新输入。';
            }
            $res = '找到客户【'.$data[$key]['Name'].'】，请直接输入跟进信息（可输入多条信息|【超过15分钟】或者输入【输入完毕】系统将退出记录状态）。'.self::nn().'';
            self::set_state('登记信息-信息登记中');
            Cache::set('Customer_info_'.$this->user->UserId,$data[$key],900);
            return $res;
        }else{
            $res = '';
            foreach ($data as $key => $value) {
                $res = $res.''.self::nn().''.($key+1).'：'.$value['Name'];
                if(mb_strpos($value,$this->text)){
                    $res = '找到【'.$data[$key]['Name'].'】，请直接输入跟进信息（可输入多条信息|【超过15分钟】或者输入【输入完毕】系统将退出记录状态）。'.self::nn().'';
                    self::set_state('登记信息-信息登记中');
                    Cache::set('Customer_info_'.$this->user->UserId,$data[$key],900);
                    return $res; 
                }
            } 
            return self::customervisit();
        }
    }
    /**
     * 客户跟进记录
     * @param  [type] $key [description]
     * @return [type]      [description]
     */
    public function visit_customer($key){
        //搜索客户
        $data = self::search_customer($key,false);

        if(count($data)==0){
            $res = '没有找到【'.$key.'】的信息，请您从新输入企业关键词或者点击下方链接自行查找。'.self::nn().''.encodeURI(WEBURL.'customer/list');
        }else if(count($data)==1){
            $res = '找到【'.$data[0]['Name'].'】，请直接输入跟进信息（可输入多条信息|【超过15分钟】或者输入【输入完毕】系统将退出记录状态）。'.self::nn().'';
            self::set_state('登记信息-信息登记中');
            Cache::set('Customer_info_'.$this->user->UserId,$data[0],900);
        }else if(count($data)>21){
            $res = '找到超过20条与【'.$key.'】的信息，请您在以下20条内选择(输入企业名称，或者序号都可以)，若没有您可点击链接自行查看。'.self::nn().''.encodeURI(WEBURL.'customer/list?key='.$key);
        }else{
            $res = '找到多条与【'.$key.'】的信息，(请输入输入企业名称，或者序号都可以)。'.self::nn().''.encodeURI(WEBURL.'customer/list?key='.$key);
        }
        if(count($data)>1){
            foreach ($data as $key => $value) {
                $res = $res.''.self::nn().''.($key+1).'：'.$value['Name'];
                if($info==true){
                    $res = $res.''.self::nn().encodeURI(WEBURL.'customer/customer?id='.$value['CustomerId']);
                    $res = $res.''.self::nn().'-----------------------------';
                }
            }
            self::set_state('登记信息-找到多个客户');
            Cache::set('Search_Customer_'.$this->user->UserId,$data,300);
        }
        return $res;
    }
    /**
     * 搜索企业信息
     * @param  [type] $customername [description]
     * @return [type]              [description]
     */
    public function search_customer($key,$model=true)
    {
        //关键词
        $where = '(Name like "%' . $key . '%")or(Address like "%' . $key . '%")or(UserName like "%' . $key . '%")or(UserTel like "%' . $key . '%")or(Tel like "%' . $key . '%")';
        $data = Customer::where($where);
        //如果此人是业务员 增加条件
        if (CUSTOMER_BIND_SWITCH && !Rolepower::ispower(204007, $this->user->UserId)) {
            $str              = '(BussinessId = ' . $this->user->UserId. ')';
            $str              = $str . 'or';
            $str              = $str . '(';
            $str              = $str . '(LastTime < "' . date('Y-m-d H:i:s', time() - (3600 * 24 * CUSTOMER_BIND_INVALID_DAY)) . '")';
            $str              = $str . ' or ';
            $str              = $str . '(';
            $str              = $str . '(LastTime is null ) and (AddTime < "' . date('Y-m-d H:i:s', time() - (3600 * 24 * CUSTOMER_BIND_DAY)) . '")';
            $str              = $str . ')';
            $str              = $str . ')';
            $swhere = $str;
            $data = $data->where($swhere);
        }
        $data = $data->limit(10)->select();
        if(empty($info)){
            if(count($data)==0){
                $res = '没有找到【'.$key.'】的信息，请您从新输入企业关键词或者点击下方链接自行查找。'.self::nn().''.encodeURI(WEBURL.'customer/list');
            }else{
                $res = '找到'.count($data).'条与【'.$key.'】的信息，可点击链接自行查看。'.self::nn().'列表地址：'.encodeURI(WEBURL.'customer/list?key='.$key);
            }
            if(count($data)>0){
                foreach ($data as $key => $value) {
                    $res = $res.self::nn().''.($key+1).'：'.$value['Name'];
                    $res = $res.self::nn().encodeURI(WEBURL.'customer/customer?id='.$value['CustomerId']);
                    $res = $res.self::nn().'-----------------------------';
                }
            }
            return $res;
        }else{
            return $data;
        }
    }
   
    public function nn(){
        //换行
        return ' 
';
    }
    /**
     * 判断账号是否登录
     * @return boolean [description]
     */
    private function is_login()
    {
        $data = UserModel::is_sessionlogin();
        if (!$data['code']) {
            $data['options'] = 'relogin';
            json($data)->send();
            exit;
        }
    }
}
